//
//  main.m
//  05-循环遍历
//
//  Created by dllo on 16/7/8.
//  Copyright © 2016年 dllo. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
//    定义 个数组, 包含5个字符串对象, 倒序取出数组中所 有元素, 并存储到另 可变数组中。
   // 1 定义数字
    NSArray *stringArr = @[@"李昊林", @"罗鹏飞", @"王键工", @"朱伟", @"邓存威"];
   // 2. 创建可变数组， 接受倒序的值
    NSMutableArray *mutableArray = [NSMutableArray array];
    for (NSInteger i = stringArr.count - 1; i >= 0; i--) {
   // 3. 倒序遍历
        [mutableArray addObject:stringArr[i]];
    }
    NSLog(@"%@", mutableArray);
//一个字典, 用于存储一个人的name,  age , sex三个数据, 完成对其三个数据的输出。
    NSDictionary *person = @{@"name" : @"李昊林", @"sex" : @"男", @"age" : @12};
    NSArray *allKeys = [person allKeys];
    for (NSInteger i = 0; i < allKeys.count; i++) {
        NSLog(@"key = %@ value = %@", allKeys[i], [person objectForKey:allKeys[i]] );
    }
    
  // 枚举器 （遍历方式）
  //  数组
  //NSEnumerator 依赖于集合类型（数组， 字典， 集合），不能单独使用
    NSEnumerator *stringArrayEnumerator = [stringArr objectEnumerator];
    id value = nil;
    while ((value = [stringArrayEnumerator nextObject]) != nil) {
        NSLog(@" value = %@",value);
    }
    // 倒序枚举
    NSEnumerator *rever = [stringArr reverseObjectEnumerator];
    id value1 = nil;
    while (value1 = [rever nextObject]) {
        NSLog(@"value1 = %@", value1);
    }
    
  // 字典枚举器 (字典是无序的， 没有倒序)
  // 默认取出来的值， 是value
    NSEnumerator *dicEnumerator = [person objectEnumerator];
    id dicValue = nil;
    while (dicValue = [dicEnumerator nextObject]) {
        NSArray *keys = [person allKeysForObject:dicValue];
        NSLog(@"%@",keys);
        
        NSLog(@"%@", dicValue);
    }
    
  // 集合枚举 (无序， 也没有倒序枚举)
    NSSet *set = [NSSet setWithObjects:@"100", @"120", @"119", @"12315", @"114", nil];
    NSEnumerator *setEnumerator =[set objectEnumerator];
    id setValue = nil;
    while (setValue = [setEnumerator nextObject]) {
        NSLog(@"setValue = %@", setValue);
    }
    
  // 快速枚举 for ... in (是对NSEnumerator 的封装)
//    定义一个数组, 包含5个字符串对象, 取出数组中所有字符串, 并拼接成一个新的字符串
    NSMutableString *mutableStr = [NSMutableString string];
    for (NSString *string in [stringArr reverseObjectEnumerator]) {
        [mutableStr appendString:string];
    }
    NSLog(@"%@",mutableStr);
    
    for (NSString *key in person) {
        NSLog(@"key = %@", key);
        NSLog(@"value = %@", [person objectForKey:key]);
    }
    
  // 快速枚举一个集合
    for (NSString *anyObject in set) {
        NSLog(@"anObject = %@", anyObject);
    }
    
  // 排序
  // 参数1 key ： 排序条件
  // 参数2 ascending ： YES （升序） or NO （降序）
    NSArray *arr = @[@1, @2, @3, @4];
    NSMutableArray *mutableArr = [NSMutableArray arrayWithObjects:@10, @17, @12, @13, nil];
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"self" ascending:NO];
  // 数组有排序的方法（sortedArrayUsingDescriptors）
  // 参数为一个排序条件的数组
   arr =  [arr sortedArrayUsingDescriptors:@[sortDescriptor]];
    NSLog(@"%@", arr);
   [mutableArr sortUsingDescriptors:@[sortDescriptor]];
  // 排序： 可变数组和不可变数组通过sort排序调用的方法不同
  // 1.不可变数组，排序后需要生成新的数组
  // 2.可变数组， 排序直接可以在本身之上修改
    Person *per = [[Person alloc] init];
    per.name = @"啊实打实的";
    per.age = 100;
    Person *per1 = [[Person alloc] init];
    per1.name = @"啊sss实打实的";
    per1.age = 50;
    Person *per2 = [[Person alloc] init];
    per2.name = @"啊s实打实的";
    per2.age = 200;
    Person *per3 = [[Person alloc] init];
    per3.name = @"啊s实打实的";
    per3.age = 12;
    Person *per4 = [[Person alloc] init];
    per4.name = @"啊ssssss实打实的";
    per4.age = 33;
    NSArray *perArray = @[per, per1, per2, per3, per4];
    NSLog(@"排序前 : %@", perArray);
   // 根据name排序
    NSSortDescriptor *perSort = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES];
    perArray = [perArray sortedArrayUsingDescriptors:@[perSort]];
    NSLog(@"排序后 : %@", perArray);
    
   // 排序2
    NSArray *sortString = @[@"iPhone", @"iPad", @"iTouch", @"iMac", @"Mac Mini"];
    
   sortString = [sortString sortedArrayUsingSelector:@selector(compare:)];
    NSLog(@"%@",sortString);
    
    
    
    
    
    
    
    
    
    
    return 0;
}
